home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok56.lha / MultiSelect / MultiSelect.mod < prev    next >
Text File  |  1993-08-15  |  3KB  |  123 lines

  1. (*---------------------------------------------------------------------------
  2.   :Program.    MultiSelect.mod
  3.   :Author.     Fridtjof Siebert
  4.   :Address.    Nobileweg 67, D-7-Stgt-40
  5.   :Shortcut.   [fbs]
  6.   :Version.    2.0
  7.   :Date.       01-May-91
  8.   :Copyright.  PD
  9.   :Language.   Oberon
  10.   :Translator. Amiga Oberon 2.0
  11.   :Contents.   Installs Input-Handler that translates midButton to lShift
  12.   :Usage.      "run MultiSelect" to activate / deactivate MultiSelect
  13. ---------------------------------------------------------------------------*)
  14.  
  15. MODULE MultiSelect;
  16.  
  17. IMPORT sys: SYSTEM,
  18.        e:   Exec,
  19.        es:  ExecSupport,
  20.        i:   Input,
  21.        ie:  InputEvent;
  22.  
  23. (*------  Constants:  ------*)
  24.  
  25. CONST
  26.   PortName    = "MultiSelect[fbs].Port";
  27.   ReplyName   = "MultiSelect[fbs].ReplyPort";
  28.  
  29. (*------  VARS:  ------*)
  30.  
  31. VAR
  32.   MyMsg: e.Message;
  33.   QuitMessage: e.MessagePtr;
  34.   MyPort, OldPort: e.MsgPortPtr;
  35.   InputDevPort: e.MsgPortPtr;
  36.   InputRequestBlock: e.IOStdReqPtr;
  37.   HandlerStuff: e.Interrupt;
  38.   HandlerActive, InputOpen: BOOLEAN;
  39.  
  40. (*------  InputHandler:  ------*)
  41.  
  42. PROCEDURE MyHandler(Ev{8}: ie.InputEventPtr): ie.InputEventPtr; (* $StackChk- $SaveRegs+ *)
  43. VAR
  44.   ev: ie.InputEventPtr;
  45. BEGIN
  46.   ev := Ev;
  47.   WHILE ev#NIL DO
  48.     IF ie.midButton IN ev.qualifier THEN
  49.       INCL(ev.qualifier,ie.lShift)
  50.     END;
  51.     ev := ev.nextEvent;
  52.   END;
  53.   RETURN Ev;
  54. END MyHandler; (* $StackChk= *)
  55.  
  56. (*------  MAIN:  ------*)
  57.  
  58. BEGIN
  59.  
  60. (*------  Initialization:  ------*)
  61.  
  62.   MyPort := NIL; InputDevPort := NIL; InputRequestBlock := NIL;
  63.   HandlerActive := FALSE; InputOpen := FALSE;
  64.  
  65. (*------  Have we already been started?  ------*)
  66.  
  67.   OldPort := e.FindPort(PortName);
  68.   IF OldPort#NIL THEN
  69.     MyPort := es.CreatePort(ReplyName,0); IF MyPort=NIL THEN HALT(20) END;
  70.     MyMsg.node.type := e.message;
  71.     MyMsg.replyPort := MyPort;
  72.     e.PutMsg(OldPort,sys.ADR(MyMsg)); e.WaitPort(MyPort);
  73.     es.DeletePort(MyPort); MyPort := NIL; HALT(0);
  74.   END;
  75.   MyPort := es.CreatePort(PortName,0); IF MyPort=NIL THEN HALT(20) END;
  76.  
  77. (*------  Add Inputhandler:  ------*)
  78.  
  79.   InputDevPort := es.CreatePort("",0);
  80.   IF InputDevPort=NIL THEN HALT(20) END;
  81.   InputRequestBlock := es.CreateStdIO(InputDevPort);
  82.   IF InputRequestBlock=NIL THEN HALT(20) END;
  83.   HandlerStuff.data := NIL;
  84.   HandlerStuff.code := sys.VAL(e.PROC,MyHandler);
  85.   HandlerStuff.node.pri := 51;
  86.   IF e.OpenDevice("input.device",0,InputRequestBlock,LONGSET{})#0 THEN HALT(20) END;
  87.   InputOpen := TRUE;
  88.   InputRequestBlock.command := i.addHandler;
  89.   InputRequestBlock.data := sys.ADR(HandlerStuff);
  90.   e.OldDoIO(InputRequestBlock); HandlerActive := TRUE;
  91.  
  92. (*------  Wait:  ------*)
  93.  
  94.   REPEAT e.WaitPort(MyPort); QuitMessage := e.GetMsg(MyPort) UNTIL QuitMessage#NIL;
  95.  
  96. CLOSE
  97.  
  98. (*------  Remove Inputhandler:  ------*)
  99.  
  100.   IF HandlerActive THEN
  101.     InputRequestBlock.command := i.remHandler;
  102.     InputRequestBlock.data := sys.ADR(HandlerStuff);
  103.     e.OldDoIO(InputRequestBlock);
  104.   END;
  105.   IF InputOpen THEN e.CloseDevice(InputRequestBlock) END;
  106.   IF InputRequestBlock#NIL THEN es.DeleteStdIO(InputRequestBlock) END;
  107.   IF InputDevPort#NIL THEN es.DeletePort(InputDevPort) END;
  108.  
  109. (*------  Remove Port:  ------*)
  110.  
  111.   IF MyPort#NIL THEN
  112.     e.Forbid();
  113.       IF QuitMessage=NIL THEN QuitMessage := e.GetMsg(MyPort) END;
  114.       WHILE QuitMessage#NIL DO
  115.         e.ReplyMsg(QuitMessage);
  116.         QuitMessage := e.GetMsg(MyPort);
  117.       END;
  118.       es.DeletePort(MyPort);
  119.     e.Permit();
  120.   END;
  121.  
  122. END MultiSelect.
  123.